Spring Framework ডাটাবেস অপারেশন পরিচালনার জন্য দুটি ধরনের Transaction Management সরবরাহ করে:
Spring JDBC-এর সাহায্যে ট্রানজেকশন পরিচালনা করার জন্য এই দুটি পদ্ধতি ব্যবহার করা যায়। এদের মধ্যে Declarative Transaction Management বেশি ব্যবহৃত হয় কারণ এটি সহজ এবং ক্লিন কোড প্রদান করে।
Declarative Transaction Management হলো Spring-এর AOP (Aspect-Oriented Programming) ভিত্তিক একটি পদ্ধতি, যেখানে ট্রানজেকশন ম্যানেজমেন্ট কনফিগারেশনের মাধ্যমে সম্পন্ন করা হয়। এতে কোনো এক্সপ্লিসিট (স্পষ্ট) কোড লেখা লাগে না।
@Transactional
অ্যানোটেশন ব্যবহার করে ডাটাবেস অপারেশনগুলোকে ট্রানজেকশনাল করতে পারে।Spring Transaction Management-এর জন্য প্রয়োজনীয় ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>RELEASE</version>
</dependency>
Java-based Configuration:
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
public class AppConfig {
// DataSource এবং JdbcTemplate Bean ডিফাইন করুন
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void addEmployee(String name, String department) {
String sql1 = "INSERT INTO employees (name, department) VALUES (?, ?)";
jdbcTemplate.update(sql1, name, department);
// Intentional Exception for Testing Rollback
if (department.equals("INVALID")) {
throw new RuntimeException("Invalid Department");
}
String sql2 = "UPDATE department_stats SET employee_count = employee_count + 1 WHERE department = ?";
jdbcTemplate.update(sql2, department);
}
}
Programmatic Transaction Management-এ ট্রানজেকশন ম্যানেজমেন্ট ম্যানুয়ালি কোডের মাধ্যমে পরিচালনা করা হয়। এটি যখন অত্যন্ত নিয়ন্ত্রণের প্রয়োজন হয় তখন ব্যবহার করা হয়।
PlatformTransactionManager
এবং TransactionTemplate
ব্যবহার করে ট্রানজেকশন শুরু, কমিট, এবং রোলব্যাক ম্যানুয়ালি হ্যান্ডেল করা হয়।import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private PlatformTransactionManager transactionManager;
public void addEmployee(String name, String department) {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
String sql1 = "INSERT INTO employees (name, department) VALUES (?, ?)";
jdbcTemplate.update(sql1, name, department);
if (department.equals("INVALID")) {
throw new RuntimeException("Invalid Department");
}
String sql2 = "UPDATE department_stats SET employee_count = employee_count + 1 WHERE department = ?";
jdbcTemplate.update(sql2, department);
// Commit transaction
transactionManager.commit(status);
} catch (Exception ex) {
// Rollback transaction
transactionManager.rollback(status);
throw ex;
}
}
}
DefaultTransactionDefinition
: ট্রানজেকশন প্রপার্টি সেট করতে ব্যবহৃত হয়।transactionManager.getTransaction(def)
: একটি নতুন ট্রানজেকশন শুরু করে।transactionManager.commit(status)
: সফল হলে ট্রানজেকশন কমিট করে।transactionManager.rollback(status)
: কোনো এক্সসেপশন ঘটলে রোলব্যাক করে।প্যারামিটার | Declarative | Programmatic |
---|---|---|
সহজতা | খুবই সহজ এবং ক্লিন কোড। | বেশি কোড লাগে এবং ম্যানুয়াল হ্যান্ডলিং প্রয়োজন। |
ব্যবহারযোগ্যতা | সাধারণত বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয়। | শুধুমাত্র বিশেষ পরিস্থিতিতে প্রয়োজন হয়। |
রোলব্যাক এবং কমিট | Spring নিজেই পরিচালনা করে। | ডেভেলপারকে ম্যানুয়ালি পরিচালনা করতে হয়। |
কনফিগারেশন প্রয়োজনীয়তা | @Transactional অ্যানোটেশন এবং কনফিগারেশন যথেষ্ট। | PlatformTransactionManager প্রয়োজন। |
কাস্টমাইজেশন | সীমিত কাস্টমাইজেশন। | সম্পূর্ণ কাস্টমাইজেশন সম্ভব। |
Spring JDBC-তে Declarative Transaction Management অধিক ব্যবহৃত হয় কারণ এটি কম কোডে কার্যকরী সমাধান প্রদান করে। তবে Programmatic Transaction Management ব্যবহার করতে হয় যখন বিশেষ পরিস্থিতিতে কাস্টম নিয়ন্ত্রণ দরকার হয়।
Read more